package reflect;

import reflect.ann.Test;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Comparator;

/**
 * JUnit 测试框架的原型
 * 检查 TestCase 中全部的方法
 * - 如果方法标注了 @Test 就自动执行他
 */
public class TestRunner {
    public static void main(String[] args) throws Exception {
        //找到class
        Class cls = Class.forName("reflect.TestCase");
        //创建对象
        Object obj = cls.newInstance();
        //找到全部方法(默认顺序)
        Method[] methods = cls.getDeclaredMethods();
        //查找包含 @Test注解的方法

        //先按照注解的order属性排序，排序后再执行
        Arrays.sort(methods, new Comparator<Method>() {
            @Override
            public int compare(Method o1, Method o2) {
                Test ann1 = o1.getAnnotation(Test.class);
                Test ann2 = o2.getAnnotation(Test.class);
                return ann1.order()-ann2.order();
            }
        });
        for (Method method : methods) {
            //检查方法，是否包含 @Test 注解
            if (method.isAnnotationPresent(Test.class)){
                //执行没有参数，没有返回值的方法
                method.invoke(obj);
            }
        }
    }
}
